package com.example.watertest;



import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.andengine.audio.music.Music;
import org.andengine.audio.music.MusicFactory;
import org.andengine.audio.sound.Sound;
import org.andengine.audio.sound.SoundFactory;
import org.andengine.engine.Engine;
import org.andengine.engine.FixedStepEngine;
import org.andengine.engine.camera.Camera;
import org.andengine.engine.handler.physics.PhysicsHandler;
import org.andengine.engine.options.EngineOptions;
import org.andengine.engine.options.ScreenOrientation;
import org.andengine.engine.options.WakeLockOptions;
import org.andengine.engine.options.resolutionpolicy.FillResolutionPolicy;
import org.andengine.entity.IEntity;
import org.andengine.entity.modifier.IEntityModifier;
import org.andengine.entity.modifier.IEntityModifier.IEntityModifierListener;
import org.andengine.entity.modifier.IEntityModifier.IEntityModifierMatcher;
import org.andengine.entity.modifier.JumpModifier;
import org.andengine.entity.modifier.LoopEntityModifier;
import org.andengine.entity.modifier.ScaleModifier;
import org.andengine.entity.modifier.SequenceEntityModifier;
import org.andengine.entity.primitive.DrawMode;
import org.andengine.entity.primitive.Mesh;
import org.andengine.entity.primitive.Rectangle;
import org.andengine.entity.scene.IOnSceneTouchListener;
import org.andengine.entity.scene.Scene;
import org.andengine.entity.scene.background.Background;
import org.andengine.entity.sprite.AnimatedSprite;
import org.andengine.entity.sprite.Sprite;
import org.andengine.entity.text.Text;
import org.andengine.extension.physics.box2d.FixedStepPhysicsWorld;
import org.andengine.extension.physics.box2d.PhysicsConnector;
import org.andengine.extension.physics.box2d.PhysicsFactory;
import org.andengine.extension.physics.box2d.PhysicsWorld;
import org.andengine.extension.physics.box2d.util.Vector2Pool;
import org.andengine.extension.physics.box2d.util.constants.PhysicsConstants;
import org.andengine.extension.physics.box2d.util.triangulation.EarClippingTriangulator;
import org.andengine.input.sensor.acceleration.AccelerationData;
import org.andengine.input.sensor.acceleration.IAccelerationListener;
import org.andengine.input.touch.TouchEvent;
import org.andengine.opengl.font.Font;
import org.andengine.opengl.font.FontFactory;
import org.andengine.opengl.texture.ITexture;
import org.andengine.opengl.texture.TextureOptions;
import org.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlas;
import org.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlasTextureRegionFactory;
import org.andengine.opengl.texture.region.ITextureRegion;
import org.andengine.opengl.texture.region.ITiledTextureRegion;
import org.andengine.opengl.util.GLState;
import org.andengine.ui.activity.BaseGameActivity;
import org.andengine.ui.activity.SimpleBaseGameActivity;
import org.andengine.util.adt.color.Color;
import org.andengine.util.adt.list.ListUtils;
import org.andengine.util.modifier.IModifier;

import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.physics.box2d.Body;
import com.badlogic.gdx.physics.box2d.BodyDef;
import com.badlogic.gdx.physics.box2d.BodyDef.BodyType;
import com.badlogic.gdx.physics.box2d.Fixture;
import com.badlogic.gdx.physics.box2d.FixtureDef;
import com.badlogic.gdx.physics.box2d.PolygonShape;

import android.hardware.SensorManager;
import android.util.Log;




public class PhysicsApplicationIV extends BaseGameActivity implements IOnSceneTouchListener {

	 public static int cameraWidth = 800;
	  public static int cameraHeight = 800;
	  public Scene mScene;
	  public FixedStepPhysicsWorld mPhysicsWorld;
	  private int mBodyCount = 0;
	  public static final short CATEGORYBIT_DEFAULT = 1;
	  public static final short CATEGORYBIT_RED_BOX = 2;
	  public static final short CATEGORYBIT_GREEN_BOX = 4;
	  public static final short MASKBITS_RED_BOX = CATEGORYBIT_DEFAULT + CATEGORYBIT_RED_BOX;
	  public static final short MASKBITS_GREEN_BOX = CATEGORYBIT_DEFAULT + CATEGORYBIT_GREEN_BOX;
	  public static final FixtureDef RED_BOX_FIXTURE_DEF = PhysicsFactory.createFixtureDef(1, 0.5f, 0.5f, false, CATEGORYBIT_RED_BOX, MASKBITS_RED_BOX, (short)0);
	  public static final FixtureDef GREEN_BOX_FIXTURE_DEF = PhysicsFactory.createFixtureDef(1, 0.5f, 0.5f, false, CATEGORYBIT_GREEN_BOX, MASKBITS_GREEN_BOX, (short)0); 
	
	  @Override
	  public Engine onCreateEngine(final EngineOptions
	      pEngineOptions) {
	    return new FixedStepEngine(pEngineOptions, 60);
	  }

	  @Override
	  public EngineOptions onCreateEngineOptions() {
	    EngineOptions engineOptions = new EngineOptions(true,
	      ScreenOrientation.LANDSCAPE_SENSOR, new
	        FillResolutionPolicy(), new Camera(0,
	          0, cameraWidth, cameraHeight));
	    engineOptions.getRenderOptions().setDithering(true);
	    engineOptions.getRenderOptions().
	      getConfigChooserOptions()
	        .setRequestedMultiSampling(true);
	    engineOptions.setWakeLockOptions(
	      WakeLockOptions.SCREEN_ON);
	    return engineOptions;
	  }

	  @Override
	  public void onCreateResources(OnCreateResourcesCallback pOnCreateResourcesCallback) {
	    pOnCreateResourcesCallback.
	      onCreateResourcesFinished();
	  }

	  @Override
	  public void onCreateScene(OnCreateSceneCallback pOnCreateSceneCallback) {
	    mScene = new Scene();
	    mScene.setBackground(new Background(0.9f,0.9f,0.9f));
	    pOnCreateSceneCallback.onCreateSceneFinished(mScene);
	
	  }
	  
	  
	  @Override
	  public void onPopulateScene(Scene pScene, OnPopulateSceneCallback pOnPopulateSceneCallback) {
		  
		    mPhysicsWorld = new FixedStepPhysicsWorld(60, new
		    	      Vector2(0f,-SensorManager.GRAVITY_EARTH*2),
		    	        false, 8, 3);
	  		mScene.registerUpdateHandler(mPhysicsWorld);
	  		List<Vector2> UniqueBodyVertices = new ArrayList<Vector2>();
	  		UniqueBodyVertices.addAll((List<Vector2>) ListUtils.toList(
	  		  new Vector2[] {
	  		    new Vector2(-53f,-75f),
	  		    new Vector2(-107f,-14f),
	  		    new Vector2(-101f,41f),
	  		    new Vector2(-71f,74f),
	  		    new Vector2(69f,74f),
	  		    new Vector2(98f,41f),
	  		    new Vector2(104f,-14f),
	  		    new Vector2(51f,-75f),
	  		    new Vector2(79f,9f),
	  		    new Vector2(43f,34f),
	  		    new Vector2(-46f,34f),
	  		    new Vector2(-80f,9f)
	  		}));
	  		
	  		List<Vector2> UniqueBodyVerticesTriangulated =
	  			  new EarClippingTriangulator().
	  			    computeTriangles(UniqueBodyVertices);
	  		
	  		float[] MeshTriangles =
	  			  new float[UniqueBodyVerticesTriangulated.size() * 3];
	  			for(int i = 0; i < UniqueBodyVerticesTriangulated.size(); i++) {
	  			  MeshTriangles[i*3] = UniqueBodyVerticesTriangulated.get(i).x;
	  			  MeshTriangles[i*3+1] = UniqueBodyVerticesTriangulated.get(i).y;
	  			  UniqueBodyVerticesTriangulated.get(i).
	  			    mul(1/PhysicsConstants.PIXEL_TO_METER_RATIO_DEFAULT);
	  			}
	  			Mesh UniqueBodyMesh = new Mesh(400f, 260f, MeshTriangles,
	  			  UniqueBodyVerticesTriangulated.size(), DrawMode.TRIANGLES,
	  			    this.getVertexBufferObjectManager());
	  			UniqueBodyMesh.setColor(1f, 0f, 0f);
	  			mScene.attachChild(UniqueBodyMesh);
	  			
	  			FixtureDef uniqueBodyFixtureDef =
	  				  PhysicsFactory.createFixtureDef(20f, 0.5f, 0.5f);
	  				Body uniqueBody = PhysicsFactory.createTrianglulatedBody(
	  				  mPhysicsWorld, UniqueBodyMesh, UniqueBodyVerticesTriangulated,
	  				    BodyType.DynamicBody, uniqueBodyFixtureDef);
	  				mPhysicsWorld.registerPhysicsConnector(
	  				  new PhysicsConnector(UniqueBodyMesh, uniqueBody));
	  				
	  				FixtureDef BoxBodyFixtureDef = 
	  					  PhysicsFactory.createFixtureDef(20f, 0.6f, 0.5f);
	  					Rectangle Box1 = new Rectangle(340f, 160f, 20f, 20f, 
	  					  this.getVertexBufferObjectManager());
	  					mScene.attachChild(Box1);
	  					PhysicsFactory.createBoxBody(mPhysicsWorld, Box1, 
	  					  BodyType.StaticBody, BoxBodyFixtureDef);
	  					Rectangle Box2 = new Rectangle(600f, 160f, 20f, 20f, 
	  					  this.getVertexBufferObjectManager());
	  					mScene.attachChild(Box2);
	  					PhysicsFactory.createBoxBody(mPhysicsWorld, Box2, 
	  					  BodyType.StaticBody, BoxBodyFixtureDef);
				
		  
		  mScene.setOnSceneTouchListener(this);
		  pOnPopulateSceneCallback.onPopulateSceneFinished();
				
	  }

	  @Override
	  public boolean onSceneTouchEvent(Scene pScene, TouchEvent
	      pSceneTouchEvent) {
		 
	    return true;
	  }

	
		
	
	
}
